Laboratorio 8 y 9 - CNN Caso de estudio

Los datos

Usará un subconjunto del Conjunto LendingClub descargado de Kaggle: https://www.kaggle.com/wordsforthewise/lending-club

NOTA: No descargue el archivo desde el sitio. El conjunto de datos que se les ha proveído ya ha sido trabajado y contiene algunas ingeierías de características "feature engineering" que debe realizar. Si usa el archivo original, no podrá seguir esta guía!

LendingClub es una empresa estadounidense de préstamos de tipo peer-to-peer (entre pares), ubicada en San Francisco California.[3] Fue la primera empresa prestamista "peer-to-peer" en registrar su oferta como seguridades ante la Security and Exchange Commission (SEC), y ofrecer intercambio de préstamos en un mercado secundario. LendingClub es la plataforma de préstamos "peer-to-peer" más grande del mundo.

El objetivo

Dados los datos históricos de los préstamos realizados, con información de si el cliente pagó o no, se puede realizar un modelo que pueda predecir si un cliente pagará o no el préstamo recibido. De esta manera, en el futuro cuando llegue un cliente potencial, se puede evaluar si pagará o no el préstamo. Tenga en mente las métricas de clasificación al evaluar el rendimiento de su modelo!

La columna loan_status es la que contiene la étiqueta

Vistazo general de los datos



Hay muchos conjuntos de datos de LendingClub en Kaggle. Esta información corresponde al conjunto de datos que se le ha provisto:

LoanStatNew Description
0 loan_amnt The listed amount of the loan applied for by the borrower. If at some point in time, the credit department reduces the loan amount, then it will be reflected in this value.
1 term The number of payments on the loan. Values are in months and can be either 36 or 60.
2 int_rate Interest Rate on the loan
3 installment The monthly payment owed by the borrower if the loan originates.
4 grade LC assigned loan grade
5 sub_grade LC assigned loan subgrade
6 emp_title The job title supplied by the Borrower when applying for the loan.*
7 emp_length Employment length in years. Possible values are between 0 and 10 where 0 means less than one year and 10 means ten or more years.
8 home_ownership The home ownership status provided by the borrower during registration or obtained from the credit report. Our values are: RENT, OWN, MORTGAGE, OTHER
9 annual_inc The self-reported annual income provided by the borrower during registration.
10 verification_status Indicates if income was verified by LC, not verified, or if the income source was verified
11 issue_d The month which the loan was funded
12 loan_status Current status of the loan
13 purpose A category provided by the borrower for the loan request.
14 title The loan title provided by the borrower
15 zip_code The first 3 numbers of the zip code provided by the borrower in the loan application.
16 addr_state The state provided by the borrower in the loan application
17 dti A ratio calculated using the borrower’s total monthly debt payments on the total debt obligations, excluding mortgage and the requested LC loan, divided by the borrower’s self-reported monthly income.
18 earliest_cr_line The month the borrower's earliest reported credit line was opened
19 open_acc The number of open credit lines in the borrower's credit file.
20 pub_rec Number of derogatory public records
21 revol_bal Total credit revolving balance
22 revol_util Revolving line utilization rate, or the amount of credit the borrower is using relative to all available revolving credit.
23 total_acc The total number of credit lines currently in the borrower's credit file
24 initial_list_status The initial listing status of the loan. Possible values are – W, F
25 application_type Indicates whether the loan is an individual application or a joint application with two co-borrowers
26 mort_acc Number of mortgage accounts.
27 pub_rec_bankruptcies Number of public record bankruptcies


Código de "arranque"

Nota: También se provee información de las variables del conjunto como un archivo .csv para que lo pueda consultar desde el NoteBook, si así lo desea:

Cargar los datos y otras importaciones

Tareas del Laboratorio

Complete las tareas abajo indicadas! Tenga en mente que usualmente hay más de una forma de completarlas!



Sección 1: Análisis Exploratorio de Datos

OBJETIVO GENERAL: Obtener una idea de cuáles variables son importantes, ver estadístas sumarias y visualizar los datos


TAREA: Ya que estará intentando predecir el estatus de préstamo, crear una gráfica de conteo, como se muestra abajo.

TAREA: Crear un histograma de la columna loan_amnt.

TAREA: Explore la correlación entre las variables contínuas.

TAREA: Visualice la tabla anterios utilizando un mapa de calor. Dependiendo de su version de matplotlib, puede que necesite ajustar manualmente el mapap.

TAREA: Debió haber notado la correlación casi perfecta con la columna "installment". Explore esta columna aún más. Despliegue las descripciones y realice una gráfica de dispersión entre ellas. ¿Será que esta relación tiene sentido? ¿Cree que pueda haber información duplicada aquí?

Si tiene sentido, ya que una es la cantidad del prestamo dado, y el otro es la cantidad mensual que el prestatario da. Esto tiene sentido ya que el prestamista aboanara una cantidad directamente relacionada a la que se le presto. No consideramos que sea informacion duplicada pero si es informacion que esta directamente relacionada.

TAREA: Crear una gráfica de caja con bigote (boxplot) que muestre la relación entre loan_status y el monto del préstamo.

TAREA: Calcule las estadísticas sumarias para el monto del préstamo, agrupado por loan_status.

TAREA: Explore las columnas Grade y SubGrade que LendingClub attribuye a los préstamos. ¿Cuáles son los valores posibles de estas?

TAREA: Crear una gráfica de conteo por grade. Configure el color (hue) con la etiqueta loan_status.

TAREA: Despliegue una gráfica de conteo por subgrado. Es posible que necesite modificar el tamaño para esta gráfica y reordenar el eje x. Siéntase libre de editar la paleta de color. Explore ambos los préstamos hechos por subgrado, así como ser separado basado en el estatus del préstamo. Luego de crear esta gráfica, realice una gráfica similar pero configure hue = "loan_status"

TAREA: Parece que los subgrados F y G subgrades no son re-pagados tan frecuentemente. Aisle esos y vuelva a hacer la gráfica solo con los dos.

TAREA: Crear una nueva columna llamada 'loan_repaid' que contendrá un 1 si el estatus del préstamos fue "Fully Paid" y un 0 si fue "Charged Off".

TAREA RETO: (Esto es difícil, pero se puede realizarse en una línea!) Crear una gráfica de barras mostrando la correlación de las variablres numéricas a la columna nueva loan_repaid. Enlace útil



Section 2: Data PreProcessing

Objetivo de la sección: Eliminar o llenar cualquier dato faltante. Eliminar variables innecesarias o repetitivas. Convertir variables tipo cadena a variables dummy.

Datos Faltantes

Explore las columnas con datos faltantes. Se pueden utilizar una variedad de factores para decidir si una variable podría, o no, ser útil y permitir ver si los datos faltantes se deben mantener, desechar o llenar.

TAREA: ¿Cuál es la longitud del dataframe?

TAREA: Crear una Serie que muestre el conteo total de valoes faltantes, por columna.

TAREA: Convertir esta Serie para que esté en términos del porcentaje del DataFrame total.

TAREA: Examinew emp_title y emp_length para ver si está bien eliminarlas. Imprima la información de esta columnas utilizandola función feat_info() que está al inicio de este notebook.

TAREA: Cuántos nombres de puestos únicos existen?

TAREA: Viéndolo realísticamente, hay demasiados nombres de puestos únicos como para tratar de convertirlos a variables dummy. Elimine esa columna.

TAREA: Crear una gráfica de conteo de la columna emp_length. Reto: Haga un "sort" por el orden de los valores.

TAREA: Despliegue la gráfica de conteo con un color (hue) separando Fully Paid vs Charged Off

TAREA RETO: Esta gráfica aún no da información sobre si hay una relacióm fuerte entre el tiempo de empleo y estar "charged off". Lo que se quiere es el porcentaje de "charge offs" por categoría. Esencialmente informando qué porcentaje de personas por categoría de empleo no pagaron su préstamo. Hay muchas formas de crear esta serie. Una vez la haya creado, trate de visualizarla con una gráfica de barras. Esto puede ser algo difícil.

TAREA: Las tasas de "Charge off" son extremadamente similares a través de todos los tiempos de empleo. Adelante, elimine la columna emp_length

TAREA: Vuelva a explorar el DataFrame para ver qué columnas aún tiene datos faltantes.

TAREA: Revise la columna title vs la columna purpose. ¿Es esta información repetida?

Es informacion repetida sin embargo purpose no tiene datos faltantes.

TAREA: La columna title es simplemente una cadena subcategoría/descripción de la columna purpose. Elimine la columna title.


NOTA: Esta es una de las partes más difíciles del laboratorio! Siéntase en libertad de llenar o eliminar los valores faltantesde la columna mort_acc, como se sienta más cómodo! Acá se está siguiendo una línea muy específica.


TAREA: Averigue qué es lo que representa la columna mort_acc

TAREA: Crear un conteo de valores de la columna mort_acc.

TAREA: Hay muchas formas de tratar los datos faltantes. Se podría intentar hacer un modelo simple para llenarlos, tal como un modelo lineal, que las llene basado en la media de las otras columnas, o se podrían encasillar las columnas en categorías y fijar el NaN como una de las categorías. No existe un método 100% correcto! Veamos las otras columnas para ver cuál(es) se correlacionan altamente a mort_acc

TAREA: Parece que la columna total_acc tiene correlación con la columna mort_acc , esto tiene sentido! Pruebe esta metodología fillna(). Agrupe el dataframe por la columna total_acc y calcule la media para mort_acc por cada instancia de total_acc. Para obtener los resultados de abajo:

TAREA RETO: Llene los valores faltantes de la columna mort_acc basados en su valor de total_acc. Si falta el valor de mort_acc, entonces lléne ese valor faltante con la media correspondiente a su valor total_acc de la Series que se creo arriba. Esto requiere usar el método .apply() con dos columnas. Vea el enlace de abajo para tener más información.

Enlace de ayuda

TAREA: revol_util y pub_rec_bankruptcies tienen datos faltantes, pero estos son menos del 0.5% de todos los datos. Elimine las filas que tienen esos datos faltantes con dropna().

Variables Categóricas y Variables Dummy

Con lo anterior ya quedó resuelto lo de los datos faltantes! Ahora solo falta ver cómo manejar los valores cadena debido a las columnas categóricas.

TAREA: Liste todas las columnas no numérias. Enlace de ayuda

Otra llamada de método muy útil


Ahora a revisar todas las variables cadena para ver qué hacer con ellas.


columna term

TAREA: Convierta la columna term a un dato entero de 36 o 60 utilizadndo .apply() or .map().

columna grade

TAREA: Ya sabemos que grade es parte de sub_grade, así que solo elimine la columna grade.

TAREA: Convierta la columna subgrade a variables dummy. Concatene estas nuevas columnas al dataframe original. Recuerde botar la columna subgrade original y de agregar drop_first = True a su llamada get_dummies.

verification_status, application_type, initial_list_status, purpose

TAREA: Convierta estas columnas: ['verification_status', 'application_type', 'initial_list_status', 'purpose'] a variables dummy y concaténelas con del dataframe original. Recuerde poner drop_first = True y eliminar las columnas originales.

home_ownership

TAREA: Revise los conteos de los valores de la columna home_ownership column.

TAREA: Convertir estos a variables dummy, pero reemplace NONE y ANY con OTHER, de tal forma que queden solo 4 categorías, MORTGAGE, RENT, OWN, OTHER. Luego concaténelas con el dataframe original. Recuerde usar drop_first = True y eliminar las columnas originales.

address

TAREA: Cree (hacer feature engineering) una columna de código postal "zip code" a partir de la columna address.

TAREA: Convierta la columna de código postal en variables dummy usando pandas. Concatene el resultado y elimine la columna original zip_code así como la columna address.

issue_d

TAREA: Esto sería fuga de datos, no se sabría de antemano si un prestamo fue, o no fue, otorgado al usar el modelo así que en teoría no existiría esta fecha, elimine esta columna.

earliest_cr_line

TAREA: Esta parece ser una fecha histórica. Extraiga el año de esta columna utilizando una función .apply, luego conviértala a un tipo numérico. Póngale de nombre a esta column 'earliest_cr_year'. Luego elimine la columna earliest_cr_line.

División Train/Test

TAREA: Importe train_test_split de sklearn.

TAREA: elimine la columna load_status que se creo antes, ya que es una duplicación de la columna loan_repaid. Se usará la columna loan_repaid ya que ya está en 0s y 1s.

TAREA: Establezca las variables X e y.



OPCIONAL

Obtener una muestra (Sample) para la hora de entrenar

OPCIONAL: Use .sample() para obtener una muestrade las 490k+ observaciones para ahorrar tiempo en el entrenamiento. Esto es altamente recomendado para computadoras con poco RAM o si no tiene un GPU.

OJO! Al hacer esto no se puede esperar el mismo rendimiento que si se utilizan todas las observaciones.



TAREA: Realice una división train/test con test_size = 0.2 y un random_state de 101.

Normalización de los datos

TAREA: Use MinMaxScaler para normalizar los datos de X_train y X_test. Recuerde que no se desea tener una fuga de datos del conjunto de prueba por lo que el ajuste se hace solamente con los datos de X_train.

Crear el modelo

TAREA: Ejecute la celda de abajo para importar las funciones necesarias de Keras.

TAREA: Construya un modelo secuencial a entrenar con los datos. Acá hay opciones ilimitadas pero esta es una sugerencia: un modelo que vaya 78 --> 39 --> 19--> 1 neurona de salida. OPCIONAL: Explore la posibilidad de agregar Capas Dropout

1)

2

TAREA: Ajuste el modelo a los datos de entrenamiento para un número mínimo de 25 epocas. También agregue los datos de validación para hacer gráficas más tarde. Opcional: agregue un tamaño de tandas de (batch_size) de 256.

TAREA: OPCIONAL: Guarde su modelo.

Sección 3: Evaluar el rendimiento del modelo.

TAREA: Grafique la pérdida de validación versus la pérdida de entrenamiento.

TAREA: Crear predicciones a partir de conjunto de datos X_test y muestre un reporte de clasificación y matriz de confusión para este conjunto de datos.

TAREA: Dado el cliente indicado abajo, ¿le ofrecería un préstamo?

TAREA: Ahora revise los datos originales, ¿Pagó este cliente su préstamo?

El modelo predijo correctamente al cliente

FIN!